package com.briup.corejava.day05;

import java.util.Arrays;

/**
 * 数组的综合应用
 * 1、计算一列数据的平均值
 * 2、最大值
 * 3、反转数组
 */
public class Test3 {
    /**
     * 获取数组中所有元素的平均值的整数部位
     * @param arr 数组
     * @return 平均数的整数值
     */
    public static int getAvg(int[] arr){
        // 元素累加和 / 元素个数
        int sum = 0;
        for(int i=0;i<arr.length;i++){
            sum += arr[i];
        }
        return sum/arr.length;
    }

    /**
     * 获得数组中最大整数
     * @param arr 数组
     * @return 最大值
     */
    public static int getMax(int[] arr){
        // 因为引用数据类型传递参数的特征
        // 这种方法会修改原数据的元素顺序
        /*Arrays.sort(arr);
        return arr[arr.length-1];*/

        // 定义遍历记录最大值，默认为第一个元素
        int max = arr[0];
        for(int i = 1;i<arr.length;i++)
            if(arr[i] > max)
                max = arr[i];
        return max;
    }

    /**
     * 反转数组，将顺序进行调换
     * @param arr 数组
     * @return 反转后的数组
     */
    public static int[] reverse(int[] arr){
        for(int i =0;i<arr.length/2;i++){
            // 交换位置
            arr[i] = arr[i] ^ arr[arr.length-1-i];
            arr[arr.length-1-i] = arr[i] ^ arr[arr.length-1-i];
            arr[i] = arr[i] ^ arr[arr.length-1-i];
        }
        return arr;
    }

    // 参数传递的问题
    public static void run(int a){
        System.out.println("获得的a："+a);
        a++;
        System.out.println("自增之后的a："+a);
    }
    public static void run(int[] arr){
        System.out.println("获得的arr："+Arrays.toString(arr));
        arr[0] = 10;
        System.out.println("给第一个元素赋值后的arr："+Arrays.toString(arr));
    }

    public static void main(String[] args) {
        // 验证参数传递
        // 基本类型的传递，值会在栈中复制一份，互不影响
        int b = 10;
        run(b);
        System.out.println(b); // a = 10;
        // 引用类型的传递，传递的是地址，地址有两份，但是堆区中的数据只有一份
        // 修改数据是可见的
        int[] arr = {1,7,2,6,4};
        run(arr);
        System.out.println(Arrays.toString(arr)); // arr?

        // 三种方法的测试
        System.out.println(getAvg(arr));
        System.out.println(getMax(arr));
        System.out.println(Arrays.toString(reverse(arr)));
    }
}
